import requests
from bs4 import BeautifulSoup
import time
import random
import pandas as pd
import io

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
    'Cookie': 'jsid=78e81fc3-e61d-4415-9ced-7b7f1222feac; JSESSIONID=E0B0819D1E2DA6003FD5C92F04387834',
}

# # 初始化一个空的 DataFrame 来存储所有数据
# all_data = pd.DataFrame()

# for i in range(1, 27):
#     urls = f'https://www.chinaports.com/chuanqibiao/{i}/SHENZHEN/null/null/query'
#     print('当前URL')
#     print(urls)
#     try:
#         print(f'\n-----------获取第{i}页-----------\n')
#         response = requests.get(urls, headers=headers)

#         if response.status_code == 200:
#             soup = BeautifulSoup(response.text, 'html.parser')
#             tables = soup.find_all('table')
            
#             for index, table in enumerate(tables):
#                 # 提取表格数据
#                 df = pd.read_html(io.StringIO(str(table)))[0] # 原来的read_html已经弃用了，使用io.StringIO代替
                
#                 # 提取链接并添加到DataFrame
#                 links = []
#                 for td in table.find_all('td'):
#                     a_tag = td.find('a', href=True)
#                     if a_tag:
#                         links.append('https://www.chinaports.com'+a_tag['href'])
                
#                 df['航线链接'] = links
#                 # 确保链接数量与DataFrame行数一致
#                 # if len(links) == len(df):
#                 #     df['航线链接'] = links
#                 # else:
#                 #     df['航线链接'] = pd.Series(links[:len(df)])
                
#                 # 将当前表格数据追加到总数据中
#                 all_data = pd.concat([all_data, df], ignore_index=True)
#                 all_data = all_data[all_data['航线链接'] != 'https://www.chinaports.comjavascript:void(0)']
#         else:
#             print(f"未获取界面，错误码：{response.status_code}")
#         print(f'\n-----------第{i}页获取完毕-----------\n')
#     except Exception as e:
#         print(f"在处理第{i}页时发生错误：{e}")
    
#     # 随机暂停一段时间，避免触发人机验证
#     time.sleep(random.randint(1, 3))

# # 将所有数据保存到同一个 Excel 文件的一个 sheet 中
# all_data.to_excel('table_link_all.xlsx', index=False)



df = pd.read_excel('table_link_all.xlsx')
print(df.head())


for i in range(len(df)):  # 遍历所有行
    # 存储结果的列表
    results = []
    urls = df.iloc[i]['航线链接']
    print(urls)
    try:
        print(f'\n-----------获取第{i + 1}行-----------\n')
        response = requests.get(urls, headers=headers)

        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')

            # 找到所有 jobs_list_box 类的 div
            divs = soup.find_all('div', class_='jobs_list_box')
            
            for index, div in enumerate(divs):
                # 初始化存储当前 div 盒子的数据
                data = []

                # 提取 jobs-first 盒子的数据（如果存在）
                jobs_first_div = div.find('div', class_='jobs-first')
                if jobs_first_div:
                    jobs_first_data = jobs_first_div.text.strip().split('\n')  # 按换行符分割
                    jobs_first_data = [item.strip() for item in jobs_first_data if item.strip()]  # 过滤空字符串
                    data.append(jobs_first_data)

                # 提取 odd-even 类的 div 的数据
                odd_even_divs = div.find_all('div', class_='odd-even')
                odd_even_data = []

                for idx, odd_even_div in enumerate(odd_even_divs):
                    odd_even_content = odd_even_div.text.strip().split('\n')  # 按换行符分割
                    odd_even_content = [item.strip() for item in odd_even_content if item.strip()]  # 过滤空字符串


                    odd_even_data.append(odd_even_content)

                # 将 odd-even 数据存储到 data 中
                data.append(odd_even_data)

                # 将当前 div 盒子的数据存储到结果列表中
                results.append(data)
        else:
            print(f"请求失败，状态码：{response.status_code}")
    
    except Exception as e:
        print(f"在处理第{i + 1}行数据时发生错误：{e}")


    # 将数据保存到 Excel 文件
    if results:
        # 提取列名（假设第一个元素是列名）
        column_names = results[0][0]  # 第一个 div 的 jobs-first 数据作为列名

        # 提取所有行数据
        rows = []
        for div_data in results:
            # 跳过列名部分，直接取 odd-even 数据
            for row in div_data[1]:  # odd-even 数据在第二个位置
                rows.append(row)

        # 创建 DataFrame
        try:
            df_result = pd.DataFrame(rows, columns=column_names)
        except ValueError as e:
            print(f'异常数据错误：{e}')
            continue

        # 保存到 Excel 文件
        df_result.to_excel(f'{i+1}航线.xlsx', index=False)

        # 读取刚刚保存的 Excel 文件
        file_path = f'{i+1}航线.xlsx'
        df_hangxian = pd.read_excel(file_path)

        # 找到第一列中包含“承运港”的第一个单元格的行索引
        mask = df_hangxian[df_hangxian.columns[0]].str.contains('转运港', na=False)
        if mask.any():
            start_row = df_hangxian[mask].index[0]  # 获取第一个匹配项的行索引
            # 删除该行及其之后的所有行
            df_hangxian = df_hangxian.loc[:start_row-1]

        # 保存修改后的数据到新的 Excel 文件
        output_file = f'{i+1}航线.xlsx'
        df_hangxian.to_excel(output_file, index=False)
        print(f"数据已成功保存到 {output_file} 文件中")
    else:
        print(f"第{i + 1}行没有提取到数据，无法保存到 Excel 文件")